package com.lyb.screen;

import com.lyb.Utils;
import com.lyb.command.AlpacaCommand;
import com.lyb.constant.SystemConstant;

import java.util.Scanner;

/**
 * 用户接口，处理用户输入命令并调用对应服务类执行
 *
 * @author Mr.Alpaca potato
 * @version 1.4.0
 */
public class AlpacaInput {
    /**
     * 接收用户输入
     */
    private final Scanner scanner;

    public AlpacaInput() {
        scanner = new Scanner(System.in);
    }

    /**
     * 用户命令输入，若格式正确则调用对应服务
     * 若命令格式错误或服务失败则返回false
     *
     * @return 处理结果
     */
    public boolean commandInput() {
        /* 读取用户输入并以空格切分 */
        String[] command = Utils.getUserInput().split(" ");
        /* 若输入是空格字符串或回车则要求重新输入 */
        if (command.length == 0 || "".equals(command[0])) {
            return false;
        }
        /* 获取可能执行该语句的命令服务类，若返回null则返回 */
        AlpacaCommand alpaca = findAlpaca(command);
        if (alpaca == null) {
            Utils.outCommandResult("[系统|命令]: 命令：" + command[0] + " 不存在");
            Utils.outCommandOver();
            return false;
        }
        /* 命令格式错误则提示错误信息 */
        if (!formatJudge(alpaca, command)) {
            Utils.outCommandResult("[系统|命令]: 命令：" + command[0] + " 参数格式错误");
            Utils.outCommandOver();
            return false;
        }
        /* 运行命令 */
        runCommand(alpaca, command);
        return true;
    }

    /**
     * 从命令服务列表中依次获得各服务类负责的命令，与用户输入命令一一比较
     * 符合则返回该服务类，不符合则返回null
     *
     * @param input 用户输入语句(已切分)
     * @return 可执行该语句的服务类，null表示该语句不合法
     */
    private AlpacaCommand findAlpaca(String[] input) {
        /* 通过匹配关键字，寻找可能执行该输入语句的服务类并返回 */
        for (AlpacaCommand alpacaCommand : SystemConstant.ALPACA_COMMANDS) {
            if (alpacaCommand.getCommand().equals(input[0])) {
                return alpacaCommand;
            }
        }
        return null;
    }

    /**
     * 输入语句格式判断，调用命令服务类格式判断方法
     * 返回判断结果
     *
     * @param alpaca 可能可执行该命令的服务类
     * @param input  用户输入(已切分)
     * @return 判断结果
     */
    private boolean formatJudge(AlpacaCommand alpaca, String[] input) {
        /* 调用指定命令服务类的格式判断方法 */
        return alpaca.formatJudge(input);
    }

    /**
     * 运行命令，调用命令服务类执行方法
     *
     * @param alpaca  可执行该命令的服务类
     * @param command 用户输入(已切分)
     */
    private void runCommand(AlpacaCommand alpaca, String[] command) {
        /* 调用指定命令服务类的运行方法 */
        alpaca.go(command);
    }
}
